在 Spring boot 可以使用 Logback 進行配置,系統預設加載日誌配置檔案
為自己的環境配置有兩種方法,如果只是簡單的更改,則可以把屬性添加到 application.properties
等配置屬性檔案中,或者對於更複雜的需求,可以使用 XML
或 Groovy
來指定設置。
在 Maven 環境中我們添加以下屬性
<!-- 整合 fluent -->
<dependency>
<groupId>org.fluentd</groupId>
<artifactId>fluent-logger</artifactId>
<version>0.3.4</version>
</dependency>
<!-- 主要是這個 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- send to flunted -->
<dependency>
<groupId>com.sndyuk</groupId>
<artifactId>logback-more-appenders</artifactId>
<version>1.8.0</version>
</dependency>
<!-- 配置 Json -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>
logback-classic
包含 logback-core
依賴關係,他們之間有著我們可以配置的屬性。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
建立一個 ConsoleAppender
的類,相似於 System.out.print
打印數據一樣。該配置設置了日誌輸出的格式,這些表示方式根據已發送到記錄器的訊息替換為生成的值。該格式含有一些符號,如下說明
如果要在與根級別不同的級別上記錄該 class 的訊息,則可以為該 class 定義自己的記錄器。如下
<logger name="com.xxx.service.MyServiceImpl" additivity="false" level="DEBUG">
<appender-ref ref="STDOUT" /> <!-- 參照前面所定義的日誌格式 -->
</logger>
不使用 additivity=false
將導致訊息被打印兩次,原因是根日誌附加程序和類級別附加程序都寫入日誌。
配置將日誌寫入檔案
<springProfile name="file">
<property name="logPath" value="/var/log"/>
<appender name="fileInfoLog" filePermissions="rw-r--r--" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers class="net.logstash.logback.composite.loggingevent.LoggingEventJsonProviders">
<pattern>
<pattern>
{
"timestamp": "%date{ISO8601}",
"level": "%level",
"application": "${springAppName:-}",
"trace": "%X{trace_id:-}",
"span": "%X{span_id:-}",
"trace_flags": "%X{trace_flags:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"message": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
<!--滾動策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--路徑-->
<fileNamePattern>${logPath}/info.%d{dd-MM-yyyy}_%i.log</fileNamePattern>
<maxHistory>7</maxHistory>
<maxFileSize>10MB</maxFileSize>
<totalSizeCap>100MB</totalSizeCap>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="fileInfoLog" />
</root>
</springProfile>
<springProfile name="staging">
...
</springProfile>
<springProfile name="dev">
...
</springProfile>
<springProfile name="!prod">
...
</springProfile>